#pragma once

#include <iostream>
#include <cstdarg>
#include <time.h>
#include <cstdio>
#include <string>

//日志是有日志级别的
#define DEBUG 0
#define NORMAL 1
#define WARNING 2
#define ERROR 3
#define FATAL 4

const char* gLevelMap[] = {
    "DEBUG",
    "NORMAL",
    "WARNING",
    "ERROR",
    "FATAL"
};

//定义LOGFILE 用于存储文件路径
#define LOGFILE "./threadpool.log"

//完整的日志需要支持：日志等级、时间、用户自定义（日志内容、文件行、文件名）
//...代表传入的多个参数
void logMessage(int level,const char* format, ...)  
{
    //当编译时有-DEBUG_SHOW时，如果level等级是debug则会返回
#ifdef DEBUG_SHOW
    if(level == DEBUG) return;
#endif

    char stdBuffer[1024]; //标准部分 
    time_t timestamp = time(nullptr);
    snprintf(stdBuffer,sizeof(stdBuffer),"%s[time:%ld] | %s | %d |",gLevelMap[level],timestamp,__FILE__,__LINE__);

    char logBuffer[1024]; //自定义部分
    va_list args;  //可变参数列表类型
    va_start(args,format);
    vsnprintf(logBuffer,sizeof(logBuffer),format,args);
    va_end(args);

    //写入文件
    // FILE* fid = fopen(LOGFILE,"a");
    // fprintf(fid,"%s:%s\n",stdBuffer,logBuffer);
    // fclose(fid);
    //输出到控制台
    printf("%s:%s\n",stdBuffer,logBuffer);
}